# app/utils/validation.py

class Validator:
    # 验证参数函数
    @staticmethod
    def validate_parameters(data):
        errors = []

        audio_url = data.get('audio_url')
        video_url = data.get('video_url')
        text = data.get('text')

        if not any([audio_url, video_url, text]):
            errors.append("audio_url、video_url、text 至少提供一个")

        title = data.get('title', '未命名')
        if not isinstance(title, str):
            errors.append("title 必须是字符串")
        elif len(title) > 20:
            errors.append("title 长度不能超过 20 个字")

        only_generate_audio = data.get('only_generate_audio')
        if only_generate_audio is None:
            errors.append("only_generate_audio 为必填参数")
        elif only_generate_audio not in [0, 1]:
            errors.append("only_generate_audio 只能是 0 或 1")

        # 验证 name_id
        name_id = data.get('name_id')
        if not name_id:
            errors.append("name_id 为必填参数")
        elif not isinstance(name_id, str):
            errors.append("name_id 必须是字符串")

        if only_generate_audio == 1:
            if not text:
                errors.append("输出仅音频时，text 为必填参数")
            else:
                if not isinstance(text, str):
                    errors.append("text 必须是字符串")
                elif len(text) > 10000:
                    errors.append("text 长度不能超过 10000 字")
            voice_id = data.get('voice_id')
            if voice_id is None:
                errors.append("输出仅音频时，voice_id 为必填参数")
            voice_type = data.get('voice_type')
            if voice_type is None:
                errors.append("输出仅音频时，voice_type 为必填参数")
        else:
            if text:
                if not isinstance(text, str):
                    errors.append("text 必须是字符串")
                elif len(text) > 10000:
                    errors.append("text 长度不能超过 10000 字")
                voice_id = data.get('voice_id')
                if voice_id is None:
                    errors.append("文本驱动时，voice_id 为必填参数")
                voice_type = data.get('voice_type', 20)
            elif audio_url:
                if not isinstance(audio_url, str) or not audio_url.startswith(('http://', 'https://')):
                    errors.append("audio_url 必须是有效的 URL")
            elif video_url:
                if not isinstance(video_url, str) or not video_url.startswith(('http://', 'https://')):
                    errors.append("video_url 必须是有效的 URL")

        return errors

    @staticmethod
    def validate_voice_parameters(data):
        errors = []

        name_id = data.get('name_id')
        if not name_id or not isinstance(name_id, str):
            errors.append("name_id 为必填参数，且必须是字符串")

        type_param = data.get('type')
        if type_param not in [9, 20]:
            errors.append("type 必须是 9 或 20")

        audio_url = data.get('audio_url')
        if not audio_url or not isinstance(audio_url, str):
            errors.append("audio_url 为必填参数，且必须是字符串")
        elif not audio_url.startswith(('http://', 'https://')):
            errors.append("audio_url 必须是有效的 URL")

        # voice_type = data.get('voice_type', 20)
        # if voice_type not in [9, 20]:
        #     errors.append("voice_type 必须是 9 或 20")

        title = data.get('title')
        if not title or not isinstance(title, str):
            errors.append("title 为必填参数，且必须是字符串")
        elif len(title) > 20:
            errors.append("title 长度不能超过 20 个字")

        return errors
